package com.example.application4.view;

import android.content.ContentValues;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import java.io.OutputStream;

/**
 * 自定义绘图视图类，用于在屏幕上绘制图形。
 */
public class DrawView extends View {

    private Paint drawPaint; // 用于绘制的画笔
    private Path drawPath; // 当前绘制的路径
    private Canvas drawCanvas; // 用于绘制的画布
    private Bitmap canvasBitmap; // 用于保存绘制内容的位图

    /**
     * 构造函数，用于从 XML 布局文件中创建 DrawView。
     *
     * @param context 上下文
     * @param attrs 属性集
     */
    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setupDrawing(); // 初始化画笔和画布
    }

    /**
     * 构造函数，用于直接通过代码创建 DrawView。
     *
     * @param context 上下文
     */
    public DrawView(Context context) {
        super(context);
        setupDrawing(); // 初始化画笔和画布
    }

    /**
     * 初始化画笔和画布的设置。
     */
    private void setupDrawing() {
        drawPath = new Path(); // 创建一个新的路径对象
        drawPaint = new Paint(); // 创建一个新的画笔对象
        drawPaint.setColor(Color.BLACK); // 设置画笔颜色为黑色
        drawPaint.setAntiAlias(true); // 开启抗锯齿
        drawPaint.setStrokeWidth(10); // 设置画笔宽度为 10 像素
        drawPaint.setStyle(Paint.Style.STROKE); // 设置画笔样式为描边
        drawPaint.setStrokeJoin(Paint.Join.ROUND); // 设置描边连接方式为圆角
        drawPaint.setStrokeCap(Paint.Cap.ROUND); // 设置描边端点样式为圆形
    }

    /**
     * 重置画布，清除所有绘制内容。
     */
    public void reset() {
        if (drawCanvas != null) {
            drawPath.reset(); // 重置路径
            drawCanvas.drawColor(Color.WHITE); // 将画布背景色设置为白色
            invalidate(); // 请求重新绘制视图
        }
    }

    /**
     * 当视图尺寸发生变化时调用此方法。
     *
     * @param w 新宽度
     * @param h 新高度
     * @param oldw 旧宽度
     * @param oldh 旧高度
     */
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        if (w > 0 && h > 0) {
            canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); // 创建一个新的位图
            drawCanvas = new Canvas(canvasBitmap); // 创建一个新的画布，关联到位图
        }
    }

    /**
     * 绘制视图内容。
     *
     * @param canvas 画布
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (canvasBitmap != null) {
            canvas.drawBitmap(canvasBitmap, 0, 0, null); // 在画布上绘制位图
            canvas.drawPath(drawPath, drawPaint); // 在画布上绘制当前路径
        }
    }

    /**
     * 处理触摸事件，用于捕捉用户的绘制操作。
     *
     * @param event 触摸事件
     * @return 是否处理了该事件
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX(); // 获取触摸点的 X 坐标
        float y = event.getY(); // 获取触摸点的 Y 坐标

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                drawPath.moveTo(x, y); // 当手指按下时，移动到触摸点
                break;
            case MotionEvent.ACTION_MOVE:
                drawPath.lineTo(x, y); // 当手指移动时，绘制线条到新的触摸点
                break;
            case MotionEvent.ACTION_UP:
                if (drawCanvas != null) {
                    drawCanvas.drawPath(drawPath, drawPaint); // 当手指抬起时，将路径绘制到画布上
                }
                drawPath.reset(); // 重置路径，准备下一次绘制
                break;
            default:
                return false; // 如果是其他类型的触摸事件，返回 false
        }
        invalidate(); // 请求重新绘制视图
        return true; // 返回 true 表示已处理该事件
    }

    /**
     * 将画布上的内容保存为图片文件到 Pictures 文件夹。
     *
     * @param context 应用上下文
     * @return 是否保存成功
     */
    public boolean saveToPictures(Context context) {
        if (canvasBitmap == null) {
            return false; // 如果位图为空，返回 false
        }

        ContentValues contentValues = new ContentValues(); // 创建一个 ContentValues 对象
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "drawing_" + System.currentTimeMillis() + ".png"); // 设置图片的显示名称
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png"); // 设置图片的 MIME 类型
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "Pictures/"); // 设置图片的相对路径

        Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); // 插入新的图片记录到 MediaStore
        if (uri == null) {
            return false; // 如果插入失败，返回 false
        }

        try (OutputStream outputStream = context.getContentResolver().openOutputStream(uri)) { // 打开输出流
            if (outputStream == null) {
                return false; // 如果输出流为空，返回 false
            }
            canvasBitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); // 将位图压缩为 PNG 格式并写入输出流
            outputStream.flush(); // 刷新输出流
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}